﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01HelloWorld //命名空间
{
    class Program
    {
        static void Main(string[] args)
        {
            #region//简单计算器
            /*
           
            float num1, num2, result;
            Console.WriteLine("请输入数字a"); //Write控制台输出语句--ReadLine输入 读取一行并返回字符串 Read只读取一个字符
            //读取键盘输入
            num1 = float.Parse(Console.ReadLine());
            Console.WriteLine("请输入数字b");
            //读取键盘输入
            num2 = int.Parse(Console.ReadLine());
            result = num1 + num2;
            //Console.WriteLine("A因子;{0},B因子{1}", num1, num2);
            //Console.WriteLine("结果是{0}",result);//第一种格式化字符号
            //Console.WriteLine($"结果是{result}");  //Line自动换行不用/n 嵌入变量
            Console.WriteLine("结果是:" + result);//第三种

            char c = '中';
            Console.WriteLine("char占{0}字节", sizeof(char));
            Console.WriteLine("char最大值是{0} ", (int)char.MaxValue);
            Console.WriteLine(c);
            const double PI = 3.1415926f;//定义常量*/
            #endregion
            #region//选择语句
            /*float price = 100;//商品价格
            bool isVIP = false;//是否是vip
            string country = "中国";
            //如果是中国客户还是vip则打五折否则打八折
            //如果是其他国家客户是vip打7折否则打9.8折

            if (country == "中国")
            
            {
                if(isVIP)
                price *= 0.5f;
                else
                price *= 0.7f; 
            }

            else
            {
                if (isVIP)
                    price *= 0.7f;
                else
                    price *= 0.98f;
            }*/
            #endregion
            #region//一年中的第几天
            /*
            
            Console.WriteLine("请输入年/月/日:");
            string str = Console.ReadLine();
            //拆分字符串
            char[] separtor = { '/' };
            string[] strArr = str.Split(separtor);
            int month = int.Parse(strArr[1]);//月
            int year = int.Parse(strArr[0]);//年
            int day = int.Parse(strArr[2]);//日
            int sum = 0;
            //Console.WriteLine(stArr[0]);
             //Console.WriteLine(stArr[1]);
              //Console.WriteLine(stArr[2]);
            switch (month-1)
                {
                    case 0:
                        sum = day;
                        break;
                    case 1:
                        sum = 31+day;
                        break;
                    case 2 :
                        sum = 31+28+day;
                        break ;
                    case 3 :
                        sum = 31 + 28 + 31+day;
                        break ;
                    default:
                        Console.WriteLine("默认处理方式,可选");
                        break;
            }   
            //判断闰年
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0 ))
                {
                    sum += 1;
                    Console.WriteLine("是闰年");
                 }
            //计算
                Console.WriteLine("这是一年中的第{0}天",sum); */
           #endregion
            #region//穷举九宫格
            int[,] array = new int[3, 3];

            int[] arrTarget = new int[9];

            ArrayList copyList = new ArrayList();

            //生成产生九宫格的数据源
            for (int counst = 0; counst < arrTarget.Length; counst++)
            {
                arrTarget[counst] = counst + 1;
            }


            //for(int i=0;i<15;i++)
            //{
            //    for(int j=0;j<3;j++)
            //    {
            //        for(int k=0;k<3;k++)
            //        {
            //            for
            //        }
            //    }
            //}
            //for(int i=0;i<arrTarget.Length;i++)
            //createNewD(array, arrTarget, i, copyList);

            createD(arrTarget, copyList);

            //int[,] a=new int[3,3]{{ 2, 9, 4 }, { 7, 5, 3 }, { 6, 1, 8 } };
            //bool flag=isPass(a);
            //print(a);
            Console.ReadLine();
            return;
        }

        static void createD(int[] targetArray, ArrayList resultSet)
        {
            for (int i = 0; i < targetArray.Length; i++)
            {
                int[,] DArray = new int[3, 3];
                int[] target = (int[])targetArray.Clone();
                DArray[0, 0] = target[i];
                target[i] = -1;
                createD(DArray, target, resultSet, 1);
            }
        }

        static void createD(int[,] DArray, int[] targetArray, ArrayList resultSet, int len)
        {
            if (len >= DArray.Length)
            {
                if (isPass(DArray))
                {
                    resultSet.Add(DArray);
                    print(DArray);
                }
                return;
            }
            int x = len % 3;
            int y = len / 3;
            // int i = 0;
            //int[] target = (int[])targetArray.Clone();
            //int[,] RDArray = (int[,])DArray.Clone();
            //while (i<9&&target[i]==-1)
            //{
            //    DArray[y, x] = target[i];
            //    target[i] = -1;
            //    createD(DArray, target, resultSet, len + 1);
            //    //i++;
            //}

            for (int i = 0; i < targetArray.Length; i++)
            {
                if (targetArray[i] == -1)
                {
                    continue;
                }
                int[] target = (int[])targetArray.Clone();
                DArray[y, x] = target[i];
                target[i] = -1;
                createD(DArray, target, resultSet, len + 1);
            }
            //int[] target = (int[])targetArray.Clone();
            //DArray[y,x] = targetArray[i];
            //targetArray[i] = -1;
            //createD(DArray, target, resultSet, len + 1);
        }

        static bool isPass(int[,] arr)
        {
            int sum;

            //行
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                sum = 0;
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    sum += arr[i, j];
                }
                if (sum != 15)
                {
                    return false;
                }
            }

            //列
            for (int i = 0; i < arr.GetLength(1); i++)
            {
                sum = 0;
                for (int j = 0; j < arr.GetLength(0); j++)
                {
                    sum += arr[j, i];
                }
                if (sum != 15)
                {
                    return false;
                }
            }

            //对角
            sum = arr[0, 0] + arr[1, 1] + arr[2, 2];
            if (sum != 15)
                return false;
            sum = arr[0, 2] + arr[1, 1] + arr[2, 0];
            if (sum != 15)
                return false;

            return true;
        }

        static void print(int[,] array)
        {
            for (int i = 0; i < array.GetLength(0); i++)
            {
                Console.WriteLine("{0}\t{1}\t{2}", array[i, 0], array[i, 1], array[i, 2]);
            }
            Console.WriteLine();
        }

        //static void createNewD(int[,] array,/*int line,int row,*/int[] arrTarget,int lowBegin/*,int[] arrLow*/,ArrayList copyList)*/
        //{

        //    //int lowNub = arrLow.Length;
        //    //for(int lowCounst=0;lowCounst<arrLow.Length;lowCounst++)
        //    //{
        //    //    if(arrLow[lowCounst]==-1)
        //    //    {
        //    //        lowNub = lowCounst;
        //    //        break;
        //    //    }
        //    //}
        //    if(lowBegin>=arrTarget.Length)
        //    {
        //        if (isPass(array))
        //        {
        //            copyList.Add(array.Clone());
        //        }
        //        return;
        //    }


        //    //生成长度为14的-1数组
        //    int[] arrLow = new int[15];
        //    for (int counst = 0; counst < arrLow.Length; counst++)
        //    {
        //        arrLow[counst] = -1;
        //    }

        //    for (int i=0;i<array.GetLength(0);i++)
        //    {
        //        for(int j=0;j<array.GetLength(1);j++)
        //        {
        //            if (i == 0&&j==0)
        //            {
        //                arrLow[0] = lowBegin;
        //                for(int counst=0;counst<arrTarget.Length; counst++)
        //                {
        //                    array[i, j] = arrTarget[lowBegin];
        //                }
        //            }
        //            addElement(array, arrTarget, arrLow, i, j);
        //        }
        //    }

        //    createNewD((int[,])array.Clone(), arrTarget, lowBegin + 1,copyList);
        //}

        //static void addElement(int[,] arry,int[] arrTarget, int[] arrLow, int line, int row)
        //{
        //    bool cantPass = true;
        //    for (int i = 0; i < arrTarget.Length; i++)
        //    {
        //        cantPass = false;
        //        int j = 0;
        //        for (; j < arrLow.Length&&arrLow[j]!=-1; j++)
        //        {
        //            if (i== arrLow[j])
        //            {
        //                cantPass = true;
        //            }

        //        }
        //        if (!cantPass)
        //        {
        //            arry[line, row] = arrTarget[i];
        //            arrLow[j] = i;
        //            break;
        //        }
        //    }
        //}

    }
#endregion}

            }
        }
    }
